/**
 * @author Q
 * @create 2025-06-17-16:37
 */

/**
 * 12.Spring事务和事务传播机制
 *      1.事务回顾
 *      2.Spring中的事务
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 3. @Transactional详解
         *      1 rollbackFor
         *          @Transactional 默认只在遇到运⾏时异常和Error时才会回滚, ⾮运⾏时异常不回滚. 即Exception的⼦类中, 除了RuntimeException及其⼦类
         *      2.事务隔离级别
         *          1 MySQL 事务隔离级别
         *          2.Spring 事务隔离级别
         *              1. Isolation.DEFAULT : 以连接的数据库的事务隔离级别为主.
         *              2. Isolation.READ_UNCOMMITTED : 读未提交, 对应SQL标准中 READ UNCOMMITTED
         *              3. Isolation.READ_COMMITTED : 读已提交,对应SQL标准中 READ COMMITTED
         *              4. Isolation.REPEATABLE_READ : 可重复读, 对应SQL标准中 REPEATABLE READ
         *              5. Isolation.SERIALIZABLE : 串⾏化, 对应SQL标准中 SERIALIZABLE
         *      3.Spring事务传播机制
         *          1.什么是事务传播机制
         *              多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的
         *          2.事务传播机制有哪些
         *              1. Propagation.REQUIRED : 默认的事务传播级别. 如果当前存在事务, 则加⼊该事务. 如果当前没有事务, 则创建⼀个新的事务.
         *              2. Propagation.SUPPORTS : 如果当前存在事务, 则加⼊该事务. 如果当前没有事务, 则以⾮事务的⽅式继续运⾏.
         *              3. Propagation.MANDATORY :强制性. 如果当前存在事务, 则加⼊该事务. 如果当前没有事务, 则抛出异常.
         *              4. Propagation.REQUIRES_NEW : 创建⼀个新的事务. 如果当前存在事务, 则把当前事务挂起. 也就是说不管外部⽅法是否开启事务, Propagation.REQUIRES_NEW 修饰的内部⽅法都会新开启⾃⼰的事务, 且开启的事务相互独⽴, 互不⼲扰.
         *              5. Propagation.NOT_SUPPORTED : 以⾮事务⽅式运⾏, 如果当前存在事务, 则把当前事务挂起(不⽤).
         *              6. Propagation.NEVER : 以⾮事务⽅式运⾏, 如果当前存在事务, 则抛出异常.
         *              7. Propagation.NESTED : 如果当前存在事务, 则创建⼀个事务作为当前事务的嵌套事务来运⾏.如果当前没有事务, 则该取值等价于 PROPAGATION_REQUIRED
         *         3.事务演示
         *
         */
    }
    public static void main2(String[] args) {
        /**
         * 2.Spring中的事务
         *      1.编程式事务
         *          1. 创建项⽬ spring-trans, 引⼊Spring Web, Mybatis, mysql等依赖
         *          2. 配置⽂件
         *          3. 实体类
         *          4. Mapper
         *          5. Service
         *          6. Contrller
         *      2.声明式事务
         *          @Transactional 作⽤
         *          @Transactional 可以⽤来修饰⽅法或类:
         *              • 修饰⽅法时: 只有修饰public ⽅法时才⽣效(修饰其他⽅法时不会报错, 也不⽣效)[推荐]
         *              • 修饰类时: 对 @Transactional 修饰的类中所有的 public ⽅法都⽣效.
         */
    }
    public static void main1(String[] args) {
        /**
         * 1.事务回顾
         *      1.什么是事务
         *          事务是一组操作的集合，不可分割
         *      2.为什么需要事务
         *          保证同步实现/失败，防止一方成功，另一方失败
         *      3.事务的操作
         *          事务的操作主要有三步:
         *              1. 开启事start transaction/ begin (⼀组操作前开启事务)
         *              2. 提交事务: commit (这组操作全部成功, 提交事务)
         *              3. 回滚事务: rollback (这组操作中间任何⼀个操作出现异常, 回滚事务)
         */
    }
}
